/****************************************************/
// BASE ON MSP432
// 程序功能：USART功能块
// 描述：打开EUSCI_A0_BASE
// by:高宇航
// E-mail:seeyounextsun@outlook.com
// 创建日期:2023/4/17
/****************************************************/
#include "usart.h"
#include "baudrate_calculate.h"
//----------------------------------------------[串口重定向]----------------------------------------------------------
// 函数简介     串口重定向
//-------------------------------------------------------------------------------------------------------------------
int fputc(int ch, FILE *f)
{
  UART_transmitData(EUSCI_A0_BASE, (uint8_t)ch);
  return ch;
}
//----------------------------------------------[UCA0_UART初始化]----------------------------------------------------------
// 函数简介     UCA0_UART初始化
// 参数说明     baudRate：波特率
// 返回参数     void
// 使用示例     uart_init(115200);
// 备注				  本函数用于开启UCA0_UART，并开启接收中断
//-------------------------------------------------------------------------------------------------------------------
void uart_uca0_init(uint32_t baudRate)
{
  const eUSCI_UART_ConfigV1 uartConfig =
      {
          EUSCI_A_UART_CLOCKSOURCE_SMCLK,                // SMCLK Clock Source
          26,                                            // BRDIV = 26
          0,                                             // UCxBRF = 0
          111,                                           // UCxBRS = 111
          EUSCI_A_UART_NO_PARITY,                        // No Parity
          EUSCI_A_UART_LSB_FIRST,                        // MSB First
          EUSCI_A_UART_ONE_STOP_BIT,                     // One stop bit
          EUSCI_A_UART_MODE,                             // UART mode
          EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION, // Oversampling
          EUSCI_A_UART_8_BIT_LEN                         // 8 bit data length
      };
  eusci_calcBaudDividers((eUSCI_UART_ConfigV1 *)&uartConfig, baudRate);                                               // 配置波特率
  MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION); // 设置引脚复用
  MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);                                                                    // 初始化串口
                                                                                                                      // 初始化串口中断
  MAP_UART_enableModule(EUSCI_A0_BASE);                                                                               // 使能串口
  UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);                                                // 使能接收中断
  Interrupt_enableInterrupt(INT_EUSCIA0);                                                                             // 使能外设中断
  Interrupt_enableMaster();                                                                                           // 使能总中断
}
// EUSCIA0_IRQHandler
void EUSCIA0_IRQHandler(void)
{
  uint32_t status = UART_getEnabledInterruptStatus(EUSCI_A0_BASE);

  if (status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) // 接收中断
  {
    UART_transmitData(EUSCI_A0_BASE, MAP_UART_receiveData(EUSCI_A0_BASE)); // 发送数据
  }
}
